package com.liu.design.structure.proxy.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author LIU
 * @version 1.0
 * @description: TODO
 * @date 2022/12/19 16:40
 */
public class CglibProxyUtil {
    public static<T> T createProxy(T t){
        // 创建一个增强器
        Enhancer enhancer = new Enhancer();
        // 设置父类
        enhancer.setSuperclass(t.getClass());
        // 设置回调方法
        enhancer.setCallback(new MethodInterceptor() {
            /**
             *
             * @param obj
             * @param method 可获取原方法的一些元数据信息
             * @param args
             * @param proxy
             * @return
             * @throws Throwable
             */
            @Override
            public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                System.out.println("Cglib 动态代理 开始");
                // 代理类为目标子类，调用目标方法invokeSuper
                Object invoke = proxy.invokeSuper(obj, args);

                System.out.println("执行方法完毕");
                return invoke;
            }
        });
        // 4. 创建代理
        return (T) enhancer.create();
    }

}
